/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.foxline.clinicplus.service;

import br.com.foxline.clinicplus.entity.Doctor;
import br.com.foxline.clinicplus.entity.Groups;
import br.com.foxline.clinicplus.entity.SystemUser;
import br.com.foxline.clinicplus.util.Msg;
import java.util.List;
import javax.ejb.Stateless;
import javax.faces.context.FacesContext;
import javax.persistence.NoResultException;
import javax.persistence.Query;

/**
 *
 * @author roniere
 */
@Stateless
public class SystemUserService extends GenericService<SystemUser> {

    public SystemUserService() {
        super(SystemUser.class);
    }

    public void saveUser(String confirm, SystemUser user) {
        try {
            if (checkUserName(user)) {
                if (compareToPassword(confirm, user)) {
                    user.setPassword(SystemUser.encryptPassword(user.getPassword()));

                    save(user);
                    Msg.messagemInfo("Usuário Cadastrado com Sucesso ");
                } else {
                    Msg.messagemError("Senhas não conferem");
                }
            } else {
                Msg.messagemError("O campo nome é obrigatório");
            }
        } catch (Exception erro) {
        }
    }

    public void updateUser(String confirm, String passwordOld, String passwordNew, SystemUser user) {
        try {

            if (checkUserPassword(passwordOld, user)) {
                if (compareToPassword(confirm, passwordNew)) {
                    user.setPassword(SystemUser.encryptPassword(passwordNew));
                    Msg.messagemInfo("Usuário Atualizado com Sucesso");
                    update(user);
                } else {
                    Msg.messagemError("Senhas não conferem");
                }

            } else {
                Msg.messagemError("Senha antiga não confere");
            }
        } catch (Exception erro) {
        }

    }

    public void updateAcess(SystemUser user) {
        try {
            update(user);
            Msg.messagemInfo("Nível de Acesso Atualizado com Sucesso");
        } catch (Exception erro) {
        }
    }

    /**
     * Compara senha do usuário
     *
     * @param comparasenha
     * @param usuario
     * @return
     */
    public boolean compareToPassword(String confirm, SystemUser user) {
        boolean b;
        if (user.getPassword().equals(confirm)) {
            b = true;
        } else {
            b = false;
        }
        return b;
    }

    public boolean compareToPassword(String confirm, String passwordNew) {
        boolean b;
        if (passwordNew.equals(confirm)) {
            b = true;
        } else {
            b = false;
        }
        return b;
    }

    /**
     * verifica se o campo name está vazio
     *
     * @param verificacampo
     * @return
     */
    public boolean checkUserName(SystemUser user) {
        boolean b;
        if (!user.getName().equals("")) {
            b = true;
        } else {
            b = false;
        }
        return b;
    }

    /**
     * Compara senha Cripitografada (Senha antiga)
     *
     * @param compara senha
     * @param cripitografia
     * @return
     */
    public boolean checkUserPassword(String senha, SystemUser user) {
        boolean b;
        String s = SystemUser.encryptPassword(senha);
        if (s.equals(user.getPassword())) {
            b = true;
        } else {
            b = false;
        }
        return b;
    }

    /**
     * Pesquisar Usuário
     *
     * @param pesquisarUsuario
     * @return
     */
    public List<SystemUser> findUsers(SystemUser user) {
        String sql = "select DISTINCT(u) from SystemUser u  JOIN u.groups g WHERE 1 = 1";


        if ((user.getName() != null) && (!user.getName().equals(""))) {
            sql += " and lower(u.name) like lower(:name)";
        }

        if (user.getGroups() != null && !user.getGroups().isEmpty()) {
            sql += " and g.name like :grupo";
        }



        Query query = getEntityManager().createQuery(sql);

        if ((user.getName() != null) && (!user.getName().equals(""))) {
            query.setParameter("name", "%" + user.getName() + "%");
        }

        if (user.getGroups() != null && !user.getGroups().isEmpty()) {
            query.setParameter("grupo", user.getGroups().get(0).getName());
        }

        return query.getResultList();

    }

    public SystemUser verifySystemUserForLogin(String nome) {
        SystemUser usr = null;
        try {
            final String sql = "select u from SystemUser u where "
                    + "u.login like :nome";
            Query query = getEntityManager().createQuery(sql);
            query.setParameter("nome", nome);
            usr = (SystemUser) query.getSingleResult();

        } catch (Exception e) {
            System.err.println("Nenhum usuário encontrado");
            return null;
        }
        return usr;
    }

    public SystemUser getCurrentUser() {
        return verifySystemUserForLogin(FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal().getName());
    }

    public List<Groups> verifyGroup(SystemUser systemUser) {
        if(systemUser == null){
            return null;
        }
        
        List<Groups> groups;
        try {
            String sql = "select g from SystemUser u JOIN u.groups g where "
                    + "u.id = :id";
            Query query = getEntityManager().createQuery(sql);
            query.setParameter("id", systemUser.getId());
            groups = query.getResultList();

        } catch (NoResultException e) {
            System.err.println("Nenhum grupo encontrado");
            return null;
        }
        return groups;
    }

    public Doctor getDoctorByLogin(String nome) {
        return getDoctor(verifySystemUserForLogin(nome));
    }

    public boolean isDoctor(SystemUser systemUser) {

        if (getDoctor(systemUser) != null) {
            return true;
        }
        return false;
    }

    public Doctor getDoctor(SystemUser systemUser) {
        if (systemUser == null) {
            return null;
        }

        Doctor doctor;

        String sql = "select d from Doctor d JOIN d.systemUser su where "
                + " su.id = :id";
        Query query = getEntityManager().createQuery(sql);
        query.setParameter("id", systemUser.getId());

        try {
            doctor = (Doctor) query.getResultList().get(0);
        } catch (Exception e) {
            return null;
        }

        return doctor;
    }

    public List<SystemUser> findUsersAtendente(SystemUser user) {
        String sql = "select u from SystemUser u  JOIN u.groups g where ";

        if ((user.getName() != null) && (!user.getName().equals(""))) {
            sql += " lower(u.name) like lower(:name) and ";
        }
        sql += " g.name like :grupo ";

        Query query = getEntityManager().createQuery(sql);

        if ((user.getName() != null) && (!user.getName().equals(""))) {
            query.setParameter("name", "%" + user.getName() + "%");
        }

        query.setParameter("grupo", "ATENDENTE");
        return query.getResultList();

    }

    public void updateUserAdmin(String passwordNew, SystemUser user) {
        try {

            user.setPassword(SystemUser.encryptPassword(passwordNew));
            Msg.messagemInfo("Usuário Atualizado com Sucesso");
            update(user);

        } catch (Exception erro) {
        }

    }

    public boolean verifyAdmin() {
        if (verifyGroup(getCurrentUser()) != null) {
            for (Groups g : verifyGroup(getCurrentUser())) {
                if (g.getName().equals("ADMINISTRADOR")) {
                    return true;
                }
            }
        }
        return false;
    }

    public boolean verifyMaster() {
        for (Groups g : verifyGroup(getCurrentUser())) {
            if (g.getName().equals("MASTER")) {
                return true;
            }
        }
        return false;
    }

    public boolean checkUserLogin(SystemUser user) {
        if (!user.getLogin().equals("")) {
            if (getEntityManager().createQuery("select su from SystemUser su where su.login like '" + user.getLogin() + "'").getResultList().isEmpty()) {
                return true;
            }
        }

        return false;
    }
}
